package com.seckill.service;

import com.seckill.dto.Exposer;
import com.seckill.dto.SeckillExecution;
import com.seckill.entity.Seckill;
import com.seckill.exception.RepeatKillException;
import com.seckill.exception.SeckillCloseException;
import com.seckill.exception.SeckillException;

import java.util.List;

/**
 * Desc ...
 * Auth Shinelon
 * Date 2017/7/4
 */
public interface SeckillService {

    //查询所有的秒杀产品
    List<Seckill> getSeckillList();

    /**
     * 获取单个秒杀商品
     * @param seckillId
     * @return
     */
    Seckill getById(Long seckillId);


    /**
     * 返回秒杀地址
     * 否则输出系统时间和秒杀开启时间
     * @param seckillId
     */
    Exposer exportSeckillUri(Long seckillId);


    /**
     * 执行秒杀操作
     * @param seckillId
     * @param userPhone
     * @param md5
     */
    SeckillExecution executeSeckill(Long seckillId, Long userPhone, String md5) throws SeckillException, SeckillCloseException, RepeatKillException;

    /**
     * 执行秒杀操作,通过存储过程的方式来实现业务逻辑,事物锁控制在服务器断,避免客户端网络延迟以及JAVA GC 造成的性能问题
     * @param seckillId
     * @param userPhone
     * @param md5
     */
    SeckillExecution executeSeckillProcedure(Long seckillId, Long userPhone, String md5) throws SeckillException, SeckillCloseException, RepeatKillException;

}
